package com.weixin.utils;


/**
 * Copyright &copy; 2012-2013 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 */

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

import org.apache.commons.lang3.time.DateFormatUtils;

public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
	
	
	public static String[] parsePatterns = { "yyyy-MM-dd",
			"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd",
			"yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" };

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd）
	 */
	public static String getDate() {
		return getDate("yyyy-MM-dd");
	}

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String getDate(String pattern) {
		return DateFormatUtils.format(new Date(), pattern);
	}

	/**
	 * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String formatDate(Date date, Object... pattern) {
		String formatDate = null;
		if (pattern != null && pattern.length > 0) {
			formatDate = DateFormatUtils.format(date, pattern[0].toString());
		} else {
			formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
		}
		return formatDate;
	}

	/**
	 * 得到当前时间字符串 格式（HH:mm:ss）
	 */
	public static String getTime() {
		return formatDate(new Date(), "HH:mm:ss");
	}

	/**
	 * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String getDateTime() {
		return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前年份字符串 格式（yyyy）
	 */
	public static String getYear() {
		return formatDate(new Date(), "yyyy");
	}

	/**
	 * 得到当前月份字符串 格式（MM）
	 */
	public static String getMonth() {
		return formatDate(new Date(), "MM");
	}

	/**
	 * 得到当天字符串 格式（dd）
	 */
	public static String getDay() {
		return formatDate(new Date(), "dd");
	}

	/**
	 * 得到当前星期字符串 格式（E）星期几
	 */
	public static String getWeek() {
		return formatDate(new Date(), "E");
	}

	/**
	 * getweek from date
	 * @param date
	 * @return
	 */
	public static String getWeek(Date date){
		return formatDate(date, "E");
	}
	
	/**
	 * 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
	 * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" }
	 */
	public static Date parseDate(Object str) {
		if (str == null) {
			return null;
		}
		try {
			return parseDate(str.toString(), parsePatterns);
		} catch (ParseException e) {
			return null;
		}
	}


	
	/**
	 * 获取过去的天数
	 * 
	 * @param date
	 * @return
	 */
	public static long pastDays(Date date) {
		long t = new Date().getTime() - date.getTime();
		return t / (24 * 60 * 60 * 1000);
	}

	/**
	 * @param args
	 * @throws ParseException
	 */
	// public static void main(String[] args) throws ParseException {
	// System.out.println(formatDate(parseDate("2010/3/6")));
	// System.out.println(getDate("yyyy年MM月dd日 E"));
	// long time = new Date().getTime()-parseDate("2012-11-19").getTime();
	// System.out.println(time/(24*60*60*1000));
	// / }

	/**
	 * 把时间格式的字符串转换成LONG
	 * 
	 * @param dateString
	 * @param dateFormt
	 * @return
	 */
	public static long DateStringToLong(String dateString, String dateFormt) {

		return DateToLong(parseDateString(dateString, dateFormt));

	}

	/**
	 * 把 date转换成LONG
	 * 
	 * @param date
	 * @return long
	 */
	public static long DateToLong(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		long l = calendar.getTimeInMillis();
		return l;

	}

	public static long DateToLong(Date date, String formatStr) {
		String dateStr = formatDate(date, formatStr);

		return DateToLong(dateStr, formatStr);

	}

	/**
	 * 把当前时间格式化成dateStr后转换成LONG形
	 * 
	 * @param dateStr
	 * @return long
	 */
	public static Long DateToLong(String dateStr) {
		return DateToLong(dateStr, "yyyy-MM-dd HH:mm:ss");
	}

	public static long DateToLong(String dateStr, String formatStr) {
		Date date = parseDateString(dateStr, formatStr);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		long l = calendar.getTimeInMillis();
		return l;
	}

	/**
	 * 把当前时间转换成LONG形
	 * 
	 * @return long
	 */
	public static Long DateToLong() {
		Date d = new Date();
		return DateToLong(d);
	}

	/**
	 * 把当前时间转换成String
	 * 
	 * @return long
	 */
	public static String DateToString(String format) {

		return LongToDateStr(DateToLong(), format);
	}

	/**
	 * 把时间格式的LONG形转换成时间类型（Date）
	 * 
	 * @param l
	 * @return Date
	 */
	public static Date LongToDate(long l) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(l);
		return calendar.getTime();
	}

	/**
	 * 把时间格式的LONG形转换成字符串形的时间
	 * 
	 * @param l
	 * @param formatStr
	 * @return String
	 */
	public static String LongToDateStr(long l, String formatStr) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(l);
		Date date = calendar.getTime();
		return formatDate(date, formatStr);
	}

	/**
	 * 将日值Long字符串转换成Timestamp类型
	 * 
	 * @param str
	 *            参数字符串
	 * @return String
	 */
	public static String parseLongString(String str, String formarStr) {
		if (str == null || str.equals(""))
			return null;
		try {
			long time = Long.parseLong(str);
			Timestamp timestamp = new Timestamp(time);
			return formatDate(timestamp, formarStr);
		} catch (Exception ex) {
			return "";
		}

	}

	public static String parseLongString(long time, String formarStr) {
		if (time == 0)
			return "";
		try {

			Timestamp timestamp = new Timestamp(time);
			return formatDate(timestamp, formarStr);
		} catch (Exception ex) {
			return "";
		}

	}

	/**
	 * 将日期format成指定格式字符串
	 * 
	 * @param dt
	 *            日期
	 * @param format
	 *            格式
	 * @return String
	 */
	public static String formatDate(Date dt, String format) {
		if ((dt == null) || format == null) {
			return "";
		}
		String strDate = "";
		String s1;
		try {
			SimpleDateFormat DATA_FORMAT = new SimpleDateFormat(format);
			strDate = DATA_FORMAT.format(dt);
			String s = strDate;
			return s;
		} catch (Exception e) {
			s1 = null;
		}
		return s1;
	}

	/**
	 * 调整时间 将指定日期调整 时间
	 * 
	 * @param date
	 *            参数日期
	 * @param field
	 *            自定字段域 。格式：Calendar.常量
	 * @param amount
	 *            调整数量
	 * @param format
	 *            调整时间后按做格式输出
	 * @return String
	 */
	public static String getAdjustDate(Date date, int field, int amount,
			String format) {
		if ((date == null) || format == null) {
			return "";
		}
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.add(field, amount);
		Date newDate = can.getTime();
		String dateStr = formatDate(newDate, format);
		return dateStr;
	}

	/**
	 * 调整时间 将指定日期调整 时间
	 * 
	 * @param date
	 *            参数日期
	 * @param field
	 *            自定字段域 格式：Calendar.常量
	 * @param amount
	 *            调整时间后按做格式输出
	 * @return String
	 */
	public static Date getAdjustDate(Date date, int field, int amount) {
		if ((date == null)) {
			return null;
		}
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.add(field, amount);
		Date newDate = can.getTime();
		return newDate;
	}

	/**
	 * 调整时间 将指定日期调整 时间
	 * 
	 * @param dateStr
	 *            参数日期
	 * @param field
	 *            自定字段域 格式：Calendar.常量
	 * @param amount
	 *            调整时间后按做格式输出
	 * @return String
	 */
	public static Date getAdjustDate(String dateStr, int field, int amount) {
		Date date = parseDateString(dateStr, "yyyy-MM-dd");

		return getAdjustDate(date, field, amount);
	}

	/**
	 * 调整时间 将指定日期调整 时间
	 * 
	 * @param dateString
	 *            日期字符串 2008-07-10 23:21:20 被格式化成 yyyy-MM-dd
	 * @param field
	 *            自定字段域 。格式：Calendar.常量
	 * @param amount
	 *            调整数量
	 * @param outFormat
	 *            调整时间后按做格式输出
	 * @return String
	 */
	public static String getAdjustDate(String dateString, int field,
			int amount, String outFormat) {

		return getAdjustDate(dateString, "yyyy-MM-dd", field, amount, outFormat);
	}

	/**
	 * 调整时间 将指定日期调整 时间
	 * 
	 * @param dateString
	 *            日期字符串 2008-07-10 23:21:20
	 * @param inFormart
	 *            把第一个参数按什么字符串格式化 yyyy-MM-dd
	 * @param field
	 *            自定字段域 。格式：Calendar.常量
	 * @param amount
	 *            调整数量
	 * @param outFormat
	 *            调整时间后按做格式输出
	 * @return String
	 */

	public static String getAdjustDate(String dateString, String inFormart,
			int field, int amount, String outFormat) {
		Date date = parseDateString(dateString, inFormart);
		if ((date == null) || outFormat == null) {
			return "";
		}
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.add(field, amount);
		Date newDate = can.getTime();
		String dateStr = formatDate(newDate, outFormat);
		return dateStr;
	}

	public static long getBetweenDiffDay(Date date1, Date date2)
			throws Exception {
		long date1Value = date1.getTime();
		long date2Value = date2.getTime();
		long diff = (date1Value - date2Value) / (24 * 3600 * 1000);
		return diff;
	}

	public static long getBetweenDiffHour(Date date1, Date date2)
			throws Exception {
		long date1Value = date1.getTime();
		long date2Value = date2.getTime();
		long diff = (date1Value - date2Value) / (3600 * 1000);
		return diff;
	}

	/**
	 * 得到指定日期所在月的最后一天,如果给定时间是月末,返回值应该是下个月末
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getMonthEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末
		if (can.get(Calendar.DAY_OF_MONTH) == can
				.getActualMaximum(Calendar.DAY_OF_MONTH)) {
			can.add(Calendar.MONTH, 1);
		}
		can.set(Calendar.DAY_OF_MONTH,
				can.getActualMaximum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);

		return can.getTime();
	}

	/**
	 * 得到指定日期所在月的第一天的0点0分0秒
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getCurrentMonthBegin(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末

		can.set(Calendar.DAY_OF_MONTH,
				can.getActualMinimum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 00);
		can.set(Calendar.MINUTE, 00);
		can.set(Calendar.SECOND, 00);

		return can.getTime();
	}

	/**
	 * 得到指定日期所在月的第最后天的23点59分59秒
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getCurrentMonthEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末

		can.set(Calendar.DAY_OF_MONTH,
				can.getActualMaximum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);

		return can.getTime();
	}

	/**
	 * 得到今天所在月的最后一天, 如果给定时间是月末,返回值应该是下个月末
	 * 
	 * @return Date
	 */
	public static Date getMonthEnd() {
		Date date = new Date();
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明给定时间是月末,返回值应该是下个月末
		if (can.get(Calendar.DAY_OF_MONTH) == can
				.getActualMaximum(Calendar.DAY_OF_MONTH)) {
			can.add(Calendar.MONTH, 1);
		}
		can.set(Calendar.DAY_OF_MONTH,
				can.getActualMaximum(Calendar.DAY_OF_MONTH));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);

		return can.getTime();
	}

	/**
	 * 获得当前月是那个月
	 * 
	 * @return int
	 */
	public static int getCurrentMonth() {
		Calendar calendar = Calendar.getInstance();

		return calendar.get(Calendar.MONTH) + 1;
	}

	/**
	 * 得到指定日期所在周的的最后一天,如果传入的时间已经是周末,返回值应该是下个周末
	 * 
	 * @param date
	 * @return Date
	 */

	public static Date getWeekEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明传入的时间已经是周末,返回值应该是下个周末
		if (1 == can.get(Calendar.DAY_OF_WEEK)) {
			can.add(Calendar.WEEK_OF_MONTH, 1);
		}
		can.set(Calendar.DAY_OF_WEEK,
				can.getActualMaximum(Calendar.DAY_OF_WEEK));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		can.add(Calendar.DAY_OF_MONTH, 1);
		return can.getTime();
	}

	/**
	 * 得到指定日期第二天的结束时间
	 * 
	 * @param date
	 * @return Date
	 */
	public static Date getTomorrowEnd(Date date) {
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		can.add(Calendar.DAY_OF_MONTH, 1);
		return can.getTime();
	}

	/**
	 * 得到现在时间所在周的的最后一天,如果传入的时间已经是周末,返回值应该是下个周末
	 * 
	 * @return Date
	 */
	public static Date getWeekEnd() {
		Date date = new Date();
		Calendar can = Calendar.getInstance();
		can.setTime(date);
		// 说明传入的时间已经是周末,返回值应该是下个周末
		if (1 == can.get(Calendar.DAY_OF_WEEK)) {
			can.add(Calendar.WEEK_OF_MONTH, 1);
		}
		can.set(Calendar.DAY_OF_WEEK,
				can.getActualMaximum(Calendar.DAY_OF_WEEK));
		can.set(Calendar.HOUR_OF_DAY, 23);
		can.set(Calendar.MINUTE, 59);
		can.set(Calendar.SECOND, 59);
		can.add(Calendar.DAY_OF_MONTH, 1);
		return can.getTime();
	}

	/**
	 * 将dt格式化成指定格式
	 * 
	 * @param dt
	 *            时间
	 * @param format
	 *            格式
	 * @return String
	 */
	public static String formatTime(Timestamp dt, String format) {
		if ((dt == null) || format == null) {
			return "";
		}
		String strDate = "";
		String s1;
		try {
			SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(format);
			strDate = DATE_FORMAT.format(dt);
			String s = strDate;
			return s;
		} catch (Exception e) {
			s1 = null;
		}
		return s1;
	}

	/**
	 * 将日值字符串转换成Date类型
	 * 
	 * @param dateString
	 *            参数字符串
	 * @param dateFormt
	 *            格式
	 * @return Date
	 */
	public static Date parseDateString(String dateString, String dateFormt) {
		if (dateString == null || dateString.equals(""))
			return null;
		Date dt = null;
		try {
			DateFormat df = new SimpleDateFormat(dateFormt);
			dt = df.parse(dateString);

		} catch (Exception pe) {
		}

		return dt;
	}

	public static void main(String[] str) {
		long l = new Long("1282613532726");
		System.out.println(DateUtils.LongToDateStr(l, "yyyy-MM-dd HH:mm:ss"));
	}
	
	/**
	 * 获取中文的月份
	 * @param month
	 * @return
	 */
	public static String getChinaMonths(Integer month){
		HashMap< Integer, String> chinaMonth = new HashMap<Integer, String>();
		chinaMonth.put(1, "一月");
		chinaMonth.put(2, "二月");
		chinaMonth.put(3, "三月");
		chinaMonth.put(4, "四月");
		chinaMonth.put(5, "五月");
		chinaMonth.put(6, "六月");
		chinaMonth.put(7, "七月");
		chinaMonth.put(8, "八月");
		chinaMonth.put(9, "九月");
		chinaMonth.put(10, "十月");
		chinaMonth.put(11, "十一月");
		chinaMonth.put(12, "十二月");
		return chinaMonth.get(month);	
				
	}
}
